/****************************************************************************
**
** Trolltech hereby grants a license to use the Qt/Eclipse Integration
** plug-in (the software contained herein), in binary form, solely for the
** purpose of creating code to be used with Trolltech's Qt software.
**
** Qt Designer is licensed under the terms of the GNU General Public
** License versions 2.0 and 3.0 ("GPL License"). Trolltech offers users the
** right to use certain no GPL licensed software under the terms of its GPL
** Exception version 1.2 (http://trolltech.com/products/qt/gplexception).
**
** THIS SOFTWARE IS PROVIDED BY TROLLTECH AND ITS CONTRIBUTORS (IF ANY) "AS
** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
** OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** Since we now have the GPL exception I think that the "special exception
** is no longer needed. The license text proposed above (other than the
** special exception portion of it) is the BSD license and we have added
** the BSD license as a permissible license under the exception.
**
****************************************************************************/

#include <QApplication>
#include <QTime>
#include <QTimer>

#include "BlogView.h"
#include "wpmsghandler.h"
#include "utils.h"
#include "version.h"
#include "SplashScreen.h"
#include "ScopedTimer.h"

/* Debug stuff here
 * Platform etc. defines are in Qt includes, so they need to be first...
 */

//#define SYMBIAN_QSS_DEBUG_FILE "C:/Data/wp_debug.qss"

#if defined(Q_OS_SYMBIAN) && !defined(__WINSCW__)
//#define SYMBIAN_DEBUG_FILE "C:\\Data\\wplog.txt"
#endif

/* End of debug stuff */

void selectAndLoadStylesheet();
void loadStyleSheet(const QString &sheetName);
void loadStyleSheet(QFile &file);

#ifdef Q_OS_SYMBIAN
void setupSymbianStuff(QApplication & application)
{
#ifdef SYMBIAN_DEBUG_FILE
    WPMsgHandler handler(SYMBIAN_DEBUG_FILE);
    handler.hideMsgType(QtWarningMsg);
    qInstallMsgHandler(WPMsgHandler::handler);
#endif // SYMBIAN_DEBUG_FILE
    
    application.setNavigationMode(Qt::NavigationModeKeypadDirectional);
}
#endif // !Q_OS_SYMBIAN

#ifdef Q_WS_MAEMO_5
void setupMaemoStuff (QApplication & app)
{
    // override to show QAction icons in menus
    app.setAttribute(Qt::AA_DontShowIconsInMenus, false);
}
#endif

int main(int argc, char *argv[])
{
#ifdef Q_OS_SYMBIAN
    QApplication::setAttribute(Qt::AA_S60DontConstructApplicationPanes);
#endif
    QApplication a(argc, argv);
    a.setOrganizationName(WP_ORGANIZATION_NAME);
    a.setApplicationName(WP_APPLICATION_NAME);
    a.setApplicationVersion(WP_VERSION_STR);

    selectAndLoadStylesheet();

    // show splash
    SplashScreen splash;
#if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) || defined(Q_WS_SIMULATOR)
    splash.showFullScreen();
#else
    splash.show();
#endif
    a.processEvents();
    
    QTime splashTime;
 //   splashTime.start();
    
#if defined(Q_OS_SYMBIAN)
    setupSymbianStuff(a);

#elif defined(Q_WS_MAEMO_5)
    setupMaemoStuff(a);

#endif // !Q_OS_SYMBIAN
    
    // run view
    BlogView view;
    view.setWindowIcon(QIcon(":/images/wp-logo.svg"));
    int waitFor = 1500 - splashTime.elapsed();

    // sometimes initialization takes longer than 1500 ms
    // giving negative waitFor to QTimer causes signal not to be connected and
    // splash never closes.
    if (waitFor < 0)
        waitFor = 0;

#if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) || defined(Q_WS_SIMULATOR)
    QTimer::singleShot(waitFor, &view, SLOT(showFullScreen()));
#else
    QTimer::singleShot(waitFor, &view, SLOT(show()));
#endif
    QTimer::singleShot(waitFor, &splash, SLOT(close()));
    
    return a.exec();
}


void selectAndLoadStylesheet()
{    
#ifdef Q_OS_SYMBIAN
    #ifdef SYMBIAN_QSS_DEBUG_FILE
        QFile file(SYMBIAN_QSS_DEBUG_FILE);
        loadStyleSheet(file);
    #else  // SYMBIAN_QSS_DEBUG
        if(Utils::smallScreen())
            {
            qDebug("Loading S60 3rd ed. stylesheet");
            loadStyleSheet("symbian_3");
            }
        else
            {
            qDebug("Loading Symbian stylesheet");
            loadStyleSheet("symbian");
            }
    #endif // !SYMBIAN_QSS_DEBUG

#else  // Q_OS_SYMBIAN
    qDebug("Loading maemo stylesheet");
    loadStyleSheet("maemo");

#endif // !Q_OS_SYMBIAN
    
    // common styles
    loadStyleSheet("common");
}

void loadStyleSheet(const QString &sheetName)
{
    QFile file(":/qss/" + sheetName.toLower() + ".qss");
    loadStyleSheet(file);
}

void loadStyleSheet (QFile &file)
{
    if (!file.open(QFile::ReadOnly)) {
        qDebug() << "WP::unable to load style sheet";
        return;
    }

    // merge with previous
    QString styleSheet = QLatin1String(file.readAll()) + qApp->styleSheet();
    qApp->setStyleSheet(styleSheet);
}
